home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Power Programmierung
/
Power-Programmierung (Tewi)(1994).iso
/
magazine
/
progjour
/
1987
/
05
/
demo.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1987-08-07
|
8KB
|
307 lines
{ Code for "TSR's Using Expanded Memory With Turbo Pascal"
by John J. Newlin
Page 28, Volume 5.5, Programmer's Journal
DEMO.PAS
Copyright 1987 by John J. Newlin, 4060-228 Rosenda Court, San
Diego, CA 92122
}
{$I demo.var}
{$I-,K-,C-,V-,B-,F4}
(* Expanded memory demonstration program
Copyright 1987 by John J. Newlin
All rights reserved *)
function emm_version : str4;
var x : integer;
u,l : str4;
r : regpack;
begin
r.ah := $46;
intr($67,r);
x := r.al and $F0;
x := x shr 4;
str(x,u);
x := r.al and $0F;
str(x,l);
emm_version := u + '.' + l;
end;
procedure emm_page_count(var total,allocated,free : integer);
var r : regpack;
begin
r.ah := $42;
intr($67,r);
total := r.dx;
free := r.bx;
allocated := total - free;
end;
procedure save_cursor;
var r : regpack;
begin
r.ah := 3;
r.bh := 0;
intr($10,r);
cursor_size := r.cx;
cursor_posit := r.dx;
end;
procedure restore_cursor;
var r : regpack;
begin
r.cx := cursor_size;
intr($10,r);
r.ah := 2;
r.dx := cursor_posit;
intr($10,r);
r.ah := $1A;
end;
procedure map_memory(logical,physical : integer);
var r : regpack;
begin
r.ax := physical;
r.ah := $44;
r.bx := logical;
r.dx := emm_handle;
intr($67,r);
end;
procedure printline(var str : str255);
var i : integer;
r : regpack;
begin
str := str + #13 + #10;
for i := 1 to ord(str[0]) do
begin
r.ah := 0;
r.dx := 0;
r.al := ord(str[i]);
intr($17,r);
end;
end;
procedure print(var str : str255);
var i : integer;
r : regpack;
begin
for i := 1 to ord(str[0]) do
begin
r.ah := 0;
r.dx := 0;
r.al := ord(str[i]);
intr($17,r);
end;
end;
function hex(n : integer) : str4;
begin
hex := hex_char[hi(n) div 16] + hex_char[hi(n) mod 16] +
hex_char[lo(n) div 16] + hex_char[lo(n) mod 16];
end;
procedure save_screen;
begin
map_memory(3,5);
move(mem[buffer_loc:0],main_buffer^,4000);
map_memory(3,3);
end;
procedure restore_screen;
begin
map_memory(3,5);
move(main_buffer^,mem[buffer_loc:0],4000);
map_memory(3,3);
end;
function number_of_emm_handles : integer;
var r : regpack;
begin
r.ah := $4B;
intr($67,r);
number_of_emm_handles := r.bx;
end;
function pages_assigned_to_handle(handle : integer) : integer;
var r : regpack;
begin
r.ah := $4C;
r.dx := handle;
intr($67,r);
pages_assigned_to_handle := r.bx;
end;
procedure main_proc;
var r : regpack;
k : char;
total,used,free,handles,pages,x,y : integer;
begin
x := 19;
y := 8;
emm_page_count(total,used,free);
handles := number_of_emm_handles;
pages := pages_assigned_to_handle(emm_handle);
clrscr;
gotoxy(x,y);
write('The Expanded Memory Manager version is ',emm_version);
gotoxy(x,wherey+2);
write(' Expanded memory frame segment ',hex(emm_seg),'H');
gotoxy(x,wherey+1);
write(' Expanded memory pages in system ',total:5);
gotoxy(x,wherey+1);
write(' Expanded memory pages available ',free:5);
gotoxy(x,wherey+1);
write(' Expanded memory pages in use ',used:5);
gotoxy(x,wherey+1);
write(' Expanded memory pages used by DEMO',pages:5);
gotoxy(x,wherey+1);
write(' Expanded memory handles in use ',handles:5);
gotoxy(x,wherey+2);
write('Press any key to continue.... ');
read(kbd,k);
end;
procedure handler;
begin
Inline(
$5D { pop bp}
/$5D { pop bp}
/$FA { cli}
/$2E { cs:}
/$8C/$1E/>SAVEDS { mov word ptr [>saveds],ds}
/$2E { cs:}
/$8C/$06/>SAVEES { mov word ptr [>savees],es}
/$2E { cs:}
/$8C/$16/>SAVESS { mov word ptr [>savess],ss}
/$2E { cs:}
/$89/$26/>SAVESP { mov word ptr [>savesp],sp}
/$2E { cs:}
/$8E/$1E/>DATASEG { mov ds,word ptr [>dataseg]}
/$2E { cs:}
/$8E/$16/>STACKSEG { mov ss,word ptr [>stackseg]}
/$2E { cs:}
/$8B/$26/>STACKPTR { mov sp,word ptr [>stackptr]}
/$FA { sti}
);
save_cursor;
save_screen;
main_proc;
restore_screen;
restore_cursor;
Inline(
$FA { cli}
/$2E
/$8E/$1E/>SAVEDS { mov ds,word ptr[>saveds]}
/$2E { cs:}
/$8E/$06/>SAVEES { mov es,word ptr[>savees]}
/$2E { cs:}
/$8E/$16/>SAVESS { mov ss,word ptr[>savess]}
/$2E { cs:}
/$8B/$26/>SAVESP { mov sp,word ptr[>savesp]}
/$FB { sti}
/$CB { return far}
);
end;
{All functions and procedures above this point will be moved to
EMS}
procedure dummy;
begin
end;
var
lastx,lasty,lastvar,xcode : integer;
procedure initialize;
var r : regpack;
begin
r.ah := $0F;
intr($10,r);
color := r.al <> 7;
r.ah := $03;
intr($10,r);
if color then buffer_loc := $B800 else buffer_loc := $B000;
end;
function emm_present : boolean;
var
ems_str : array[1..8] of char;
begin
ems_str := ' ';
move(mem[vector[$67].segment:10],ems_str,8);
emm_present := ems_str = 'EMMXXXX0';
end;
function emm_segment : integer;
var r : regpack;
begin
r.ah := $41;
intr($67,r);
emm_segment := r.bx;
end;
function get_handle(var handle : integer) : boolean;
var r : regpack;
begin
r.ah := $43;
r.bx := 8;
intr($67,r);
if r.ah = 0 then
begin
handle := r.dx;
get_handle := true;
end
else
begin
r.ah := $42;
intr($67,r);
handle := r.bx;
get_handle := false;
end;
end;
begin
initialize;
demo_main := ofs(handler);
if not emm_present then
begin
writeln('Expanded memory driver not present - aborting!',^g,^g);
halt;
end
else
begin
if not get_handle(emm_handle) then
begin
writeln;
writeln('Insufficient memory pages available - aborting!',^g,^g);
writeln('EM Manager reports ',emm_handle,' pages available.');
halt;
end;
if emm_version <> '3.2' then
begin
writeln('Not EMS version 3.2 - found instead ',emm_version,
' - aborting',^g,^g);
halt;
end;
emm_seg := emm_segment;
map_memory(0,0);
map_memory(1,1);
map_memory(2,2);
map_memory(3,3);
fillchar(mem[emm_seg:0],$FFFF,0);
lasty := ofs(dummy);
lastx := lasty shr 4;
dataseg := emm_seg + lastx + 2;
stackseg := emm_seg;
stackptr := $BFFF;
main_buffer := ptr(emm_seg,$C000); {page 6}
aux_buffer := ptr(emm_seg,$D000); {page 6}
move(mem[cseg:0],mem[emm_seg:0],ofs(dummy));
move(mem[dseg:0],mem[dataseg:0],ofs(lastvar));
end;
end.